package com.linran.webjsonrsp.websocket;

import com.linran.webjsonrsp.websocket.handler.StompPrincipalHandshakeHandler;
import com.linran.webjsonrsp.websocket.handler.WebSocketAuthHandlerInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

/**
 * websocket配置类
 *
 * @author lin
 * @date 2020-08-28 10:18
 */
@Slf4j
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {

    /**
     * 注册stomp的端点
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 允许使用socketJs方式访问，访问点为webSocketServer，允许跨域!!!
        // 在网页上我们就可以通过这个链接
        // http://localhost:8080/webSocketServer
        // 来和服务器的WebSocket连接
        registry.addEndpoint("/webSocketServer")
                .addInterceptors(new WebSocketAuthHandlerInterceptor())
                //配置自动生成用户Principal的ShakeHandler(设置Principal生成)
                //spring security可以自动生成
                .setHandshakeHandler(new StompPrincipalHandshakeHandler())
                .setAllowedOrigins("*").withSockJS();
    }

    /**
     * 配置信息代理
     * <p>
     * 用户订阅主题的前缀
     * /topic 代表发布广播，即群发
     * /queue 代表点对点，即发指定用户
     * <p>
     * 设置客户端请求前缀
     * 例如客户端发送消息的目的地为/app/sendTest，则对应控制层@MessageMapping(“/sendTest”)
     * 客户端订阅主题的目的地为/app/subscribeTest，则对应控制层@SubscribeMapping(“/subscribeTest”)
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 订阅Broker名称前缀
        registry.enableSimpleBroker("/queue", "/topic");
        // 全局使用的消息前缀（客户端订阅路径上会体现出来）
        registry.setApplicationDestinationPrefixes("/app");
        // 点对点使用的订阅前缀（客户端订阅路径上会体现出来），不设置的话，默认也是/user
        registry.setUserDestinationPrefix("/user");
    }
}
